package com.time.client.application.controller;

import com.google.common.base.Preconditions;
import com.time.auth.entity.Result;
import com.time.client.application.converter.PostDTOConverter;
import com.time.client.application.converter.PostTimelineDTOConverter;
import com.time.client.application.dto.PostDTO;
import com.time.client.application.dto.PostTimelineMonthDTO;
import com.time.client.common.entity.PageResult;
import com.time.client.domain.entity.PostBO;
import com.time.client.domain.entity.PostTimelineMonthBO;
import com.time.client.domain.service.ClientPostDomainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 文章展示控制层类
 *
 * @author: HuangQi
 * @date: Created in 16:30 2025/11/13
 * @description: 文章展示控制层
 */
@Slf4j
@RestController
@RequestMapping("/client/post")
public class PostController {

    @Autowired
    private ClientPostDomainService clientPostDomainService;

    /**
     * 时间线分页查询文章列表
     *
     * @param postDTO 分页参数
     * @return 时间线文章列表
     */
    @PostMapping("timeline")
    public Result<PageResult<PostTimelineMonthDTO>> queryTimeline(@RequestBody PostDTO postDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Client.PostController.queryTimeline.dto: {}", postDTO);
            }

            Preconditions.checkArgument(postDTO.getPageNo() == null || postDTO.getPageNo() > 0, "pageNo 必须大于 0");
            Preconditions.checkArgument(postDTO.getPageSize() == null || postDTO.getPageSize() > 0, "pageSize 必须大于 0");

            PostBO postBO = PostDTOConverter.INSTANCE.convertDTOToBO(postDTO);
            PageResult<PostTimelineMonthBO> timelineResult = clientPostDomainService.queryTimeline(postBO);
            PageResult<PostTimelineMonthDTO> dtoPage = PostTimelineDTOConverter.INSTANCE.convertBOPageToDTOPage(timelineResult);
            return Result.ok(dtoPage);
        } catch (IllegalArgumentException e) {
            log.error("Client.PostController.queryTimeline.paramError:{}", e.getMessage(), e);
            return Result.fail(e.getMessage());
        } catch (Exception e) {
            log.error("Client.PostController.queryTimeline.error:{}", e.getMessage(), e);
            return Result.fail("客户端模块分页获取文章时间线失败");
        }
    }

    /**
     * 更新文章数据
     *
     * @param postDTO 更新数据
     * @return 更新结果
     */
    @PostMapping("updatePostData")
    public Result<Boolean> updatePostData(@RequestBody PostDTO postDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Client.PostController.updatePostData.dto: {}", postDTO);
            }

            // 参数校验
            Preconditions.checkNotNull(postDTO.getPostId(), "文章的id不能为空");

            // 调用领域层
            PostBO postBO = PostDTOConverter.INSTANCE.convertDTOToBO(postDTO);
            boolean updatedResult = clientPostDomainService.updatePostData(postBO);

            // 返回结果
            return Result.ok(updatedResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Client.PostController.updatePostData.error:{}", e.getMessage(), e);
            return Result.fail("客户端模块更新文章数据失败");
        }
    }

    /**
     * 分页查询文章基本信息
     *
     * @param postDTO 筛选文章信息
     * @return 分页文章基本信息结果
     */
    @PostMapping("queryAll")
    public Result<PageResult<PostDTO>> queryAllPost(@RequestBody PostDTO postDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Client.PostController.queryAllPost.dto: {}", postDTO);
            }

            PostBO postBO = PostDTOConverter.INSTANCE.convertDTOToBO(postDTO);
            PageResult<PostBO> infoBOPageResult = clientPostDomainService.queryAllPost(postBO);

            // 返回结果
            PageResult<PostDTO> infoDTOPageResult = PostDTOConverter.INSTANCE.convertBOPageToDTOPage(infoBOPageResult);
            return Result.ok(infoDTOPageResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Client.PostController.queryAllPost.error:{}", e.getMessage(), e);
            return Result.fail("客户端模块分页获取所有文章失败");
        }
    }

    /**
     * 获取单个文章
     *
     * @param id 文章的id
     * @return 文章详细信息
     */
    @PostMapping("query/{id}")
    public Result<PostDTO> queryPost(@PathVariable("id") Long id) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Client.PostController.queryPost.id: {}", id);
            }
            // 参数校验
            Preconditions.checkNotNull(id, "文章的id不能为空");

            PostBO postBO = clientPostDomainService.queryPost(id);

            // 返回结果
            PostDTO postDTO = PostDTOConverter.INSTANCE.convertBOToDTO(postBO);
            return Result.ok(postDTO);
        } catch (Exception e) {
            // 异常处理
            log.error("Client.PostController.queryPost.error:{}", e.getMessage(), e);
            return Result.fail("客户端模块分页获取单个文章失败");
        }
    }

    /**
     * 根据分类分页查询文章基本信息
     *
     * @param postDTO 筛选文章信息
     * @return 分页文章基本信息结果
     */
    @PostMapping("queryPostByCategory")
    public Result<PageResult<PostDTO>> queryPostByCategory(@RequestBody PostDTO postDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Client.PostController.queryPostByCategory.dto: {}", postDTO);
            }

            // 参数校验
            Preconditions.checkNotNull(postDTO.getCategoryName(), "分类的名称不能为空");

            PostBO postBO = PostDTOConverter.INSTANCE.convertDTOToBO(postDTO);
            PageResult<PostBO> infoBOPageResult = clientPostDomainService.queryPostByCategory(postBO);

            // 返回结果
            PageResult<PostDTO> infoDTOPageResult = PostDTOConverter.INSTANCE.convertBOPageToDTOPage(infoBOPageResult);
            return Result.ok(infoDTOPageResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Client.PostController.queryPostByCategory.error:{}", e.getMessage(), e);
            return Result.fail("客户端模块根据分类分页获取所有文章失败");
        }
    }

    /**
     * 根据标签分页查询文章基本信息
     *
     * @param postDTO 筛选文章信息
     * @return 分页文章基本信息结果
     */
    @PostMapping("queryPostByTag")
    public Result<PageResult<PostDTO>> queryPostByTag(@RequestBody PostDTO postDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Client.PostController.queryPostByTag.dto: {}", postDTO);
            }

            // 参数校验
            Preconditions.checkNotNull(postDTO.getTagName(), "标签的名称不能为空");

            PostBO postBO = PostDTOConverter.INSTANCE.convertDTOToBO(postDTO);
            PageResult<PostBO> infoBOPageResult = clientPostDomainService.queryPostByTag(postBO);

            // 返回结果
            PageResult<PostDTO> infoDTOPageResult = PostDTOConverter.INSTANCE.convertBOPageToDTOPage(infoBOPageResult);
            return Result.ok(infoDTOPageResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Client.PostController.queryPostByTag.error:{}", e.getMessage(), e);
            return Result.fail("客户端模块根据标签分页获取所有文章失败");
        }
    }

}
